package com.hans.Utils;

import java.util.Hashtable;
import android.graphics.Bitmap;
import android.util.Log;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

/**
 * @类功能说明: 生成二维码图片示例
 */
public class QRUtils {

	/**
	 * 将文本编码成二维码的位矩阵图，用法为
	 * @param text
	 * @param width
	 * @param height
     * @return
     */
	public static BitMatrix createQRBitMatrix(String text,int width, int height){
		try {
			// 判断URL合法性
			if (text == null || "".equals(text) || text.length() < 1) 	return null;
			Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
			hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
			// 图像数据转换，使用了矩阵转换
			return new QRCodeWriter().encode(text,BarcodeFormat.QR_CODE, width, height, hints);
		} catch (WriterException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 将文本转换为二维码Bitmap
	 * @param text 要转换的地址或字符串,可以是中文
	 * @param qrcolor
	 * @param bgcolor
	 * @param width
	 * @param height
     * @return
     */
	public static Bitmap createQRImage(String text, int qrcolor, int bgcolor,int width, int height) {
		BitMatrix bitMatrix = createQRBitMatrix(text,width,height);
		int[] pixels = new int[width * height];
		// 下面这里按照二维码的算法，逐个生成二维码的像素点，两个for循环是图片横列扫描的结果
		for (int y = 0; y < width; y++) {
			for (int x = 0; x < width; x++) {
				if (bitMatrix.get(x, y)) {
					pixels[y * width + x] = qrcolor;
				} else {
					pixels[y * width + x] = bgcolor;
				}
			}
		}
		// 生成二维码图片的格式，使用ARGB_8888
		Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);
		bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
		return bitmap;
	}
	/**
	 * 将文本转换为二维码的文本型字符串。即用文本排列出二维码样式，用例：createQRText("text","■","  ",21,21);
	 * @param text 要转换的地址或字符串,可以是中文
	 * @param qrChar 二维码数据用什么字符表示 ，例如■
	 * @param bgChar 背景用什么字符表示 例如'  '
	 * @param width
	 * @param height
     * @return
     */
	public static String createQRText(String text, String qrChar, String bgChar,int width, int height) {
		BitMatrix bitMatrix = createQRBitMatrix(text,width,height);
		// 下面这里按照二维码的算法，逐个生成二维码的像素点，两个for循环是图片横列扫描的结果
		StringBuffer sb = new StringBuffer();
		for (int y = 0; y < width; y++) {
			for (int x = 0; x < width; x++) {
				if (bitMatrix.get(x, y)) {
					sb.append(qrChar);
				} else {
					sb.append(bgChar);
				}
			}
			sb.append("\n");
		}
		return sb.toString();
	}
	/**
	 * 将文本转换为二维码的文本型字符串。即用文本排列出二维码样式，
	 * @param text 要转换的地址或字符串,可以是中文
	 * @param width
	 * @param height
     * @return
     */
	public static String createQRText(String text,int width, int height) {
		BitMatrix bitMatrix = createQRBitMatrix(text,width,height);
		int[] pixels = new int[width * height];
		// 下面这里按照二维码的算法，逐个生成二维码的像素点，两个for循环是图片横列扫描的结果
		StringBuffer sb = new StringBuffer();
		for (int y = 0; y < width; y++) {
			for (int x = 0; x < width; x++) {
				if (bitMatrix.get(x, y)) {
					sb.append("■");
				} else {
					sb.append("  ");
				}
			}
			sb.append("\n");
		}
		return sb.toString();
	}
}
